Vue.createApp({
	data() {
		return {
			list: [
				[{}]
			], // 格子
			level: [ // 等级
				{
					name: '基础',
					row: 9, // 行数
					col: 9, // 列数
					count: 10 // 雷的数量
				},
				{
					name: '中级',
					row: 20, // 行数
					col: 20, // 列数
					count: 40 // 雷的数量
				},
				{
					name: '高级',
					row: 40, // 行数
					col: 40, // 列数
					count: 200 // 雷的数量
				}
			],
			current: 0, // 当前等级
			status: 'on' ,//on off
			count:0,
			m:0, //分
			s:0, //秒
			timer:null, //计时器
			num:0
		}
	},
	created() {
		this.init()
	},
	watch:{
		num(){
			if(this.num == 1){
				this.startTime()
			}
		}
	},
	methods: {
		startTime(){
			//开始计时
			this.timer=setInterval(()=>{
				this.s++
				if(this.s >= 60){
					this.m++
					this.s=0
				}
			},1000)
		},
		init() {
			// 游戏初始化
			this.m=0,this.s=0
			let level = this.level[this.current] // 当前等级信息
			this.count=level.count
			var list = [],indexList = []
			for (let i = 0; i < level.row; i++) {
				list.push([]) // 创建行
				for (let j = 0; j < level.col; j++) {
					let neb = [] //上 右上 右 右下 下 左下 左 左上
					// 当前格子：i,j
					neb.push({
						row: i - 1,
						col: j
					})
					neb.push({
						row: i - 1,
						col: j + 1
					})
					neb.push({
						row: i,
						col: j + 1
					})
					neb.push({
						row: i + 1,
						col: j + 1
					})
					neb.push({
						row: i + 1,
						col: j
					})
					neb.push({
						row: i + 1,
						col: j - 1
					})
					neb.push({
						row: i,
						col: j - 1
					})
					neb.push({
						row: i - 1,
						col: j - 1
					})
					list[i].push({
						content: 0, // 0-8 -1:雷
						neb: neb, // 邻居格子
						closed: 1, //格子是否关闭
						flag: 0 // 是否标记
					})
					// 所有格子的坐标信息
					indexList.push({
						row: i,
						col: j
					})
				}
			}
			// 2. 生成雷
			let tempIndexList = [...indexList] // 修复：创建副本避免修改原数组
			for (let i = 0; i < level.count; i++) {
				let x = Math.floor(Math.random() * tempIndexList.length) //随机生成一个坐标
				let r = tempIndexList[x].row,
					c = tempIndexList[x].col
				list[r][c].content = -1 // 设置雷
				tempIndexList.splice(x, 1) // 删除已经抽出的格子，保证不重复
			}
			// 3.填数字
			for (let i = 0; i < list.length; i++) {
				for (let j = 0; j < list[i].length; j++) {
					if (list[i][j].content != -1) { //除了雷以外的格子需要填数字
						let neb = list[i][j].neb //相邻格子
						let c = 0 //雷的数量
						neb.forEach(item => {
							let row = item.row,
								col = item.col
							if (row >= 0 && row < level.row && col >= 0 && col < level.col && list[row][col].content == -1) {
								c++
							}
						})
						list[i][j].content = c //填数字
					}
				}
			}
			this.list = list
		},
		open(item) { //翻开格子
			if (this.status == 'off') return
			if (!item.closed || item.flag) return //已经打开的格子
			item.closed = 0 //翻开格子
			this.num++
			if (item.content == -1) { //遇到雷 把所有的雷都打开
				this.status = 'off' //结束
				clearInterval(this.timer) //清除计时器
				this.list.forEach(row => {
					row.forEach(col => {
						if (col.content == -1) {
							col.closed = 0
						}
					})
				})
				// alert('游戏结束')
				return
			}
			if (item.content == 0) {
				// 翻到空白格 将空白格子的所有相邻格子翻开
				item.neb.forEach(gz => {
					let r = gz.row,
						c = gz.col
					if (r >= 0 && r < this.level[this.current].row && c >= 0 && c < this.level[this.current].col) {
						this.open(this.list[r][c]) //递归
					}
				})
			}
			// 1-8 翻过来
			this.isSuccess()
		},
		point(item) { //标记 取消
			this.num++
			if (item.flag) {
				item.flag = 0
				this.count++
			} else {
				item.flag = 1
				this.count--
			}
		},
		openSafe(item) {
			// 判断该格子的九宫格 没有标记 没有打开 是否安全
			for (let i = 0; i < item.neb.length; i++) {
				if (this.isExist(item.neb[i])) { //是否存在
					let gz = this.list[item.neb[i].row][item.neb[i].col] //当前格子
					if (gz.closed && !gz.flag) {
						if (gz.content == -1) {
							console.log('不安全')
							return
						}
					}
				}
			}
			//打开安全格
			console.log('安全')
			for (let i = 0; i < item.neb.length; i++) {
				if (this.isExist(item.neb[i])) { //是否存在
					let gz = this.list[item.neb[i].row][item.neb[i].col] //当前格子
					if (gz.closed && !gz.flag) {
						this.open(gz)
					}
				}
			}
		},
		isExist(pos) { //判断坐标是否存在
			let r = pos.row,
				c = pos.col
			if (this.list[r] && this.list[r][c] != undefined) {
				return true
			}
			return false
		},
		isSuccess() { //是否成功
			//翻开的格子数量+雷的总数 == 格子的总数
			let level = this.level[this.current]
			// x+level.count == level.row*level.col
			let total = 0
			this.list.forEach(row => {
				row.forEach(col => {
					if (col.closed == 0) total++
				})
			})
			if (total + level.count == level.row * level.col) {
				alert('恭喜你，挑战成功')
				this.status = 'off'
				clearInterval(this.timer) //清除计时器
			}
		}
	}
}).mount('#app')
